//package fwmpc.resource.impl.jdbc;
//
//import fwmpc.resource.IWeiXinAttributeItem;
//import fwmpc.resource.IWeiXinCommonAttribute;
//import lombok.ToString;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.jdbc.core.JdbcTemplate;
//
//import javax.annotation.PostConstruct;
//import javax.sql.DataSource;
//import java.util.Collection;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ScheduledThreadPoolExecutor;
//import java.util.concurrent.TimeUnit;
//import java.util.concurrent.locks.ReentrantLock;
//
///**
// * 类描述:  微信属性配置——持久化处理应用
// *
// * @author 王雷
// * @version 1.0.0
// * @date 2021/1/19 0019 上午 11:33
// */
//@Slf4j
//@ToString
//public class WeiXinJdbcCommonAttribute implements IWeiXinCommonAttribute {
//
//    /**
//     * 属性描述：数据链接源对象
//     *
//     * @date : 2021/1/26 0026 下午 2:21
//     */
//    private final JdbcTemplate jdbcTemplate;
//
//    /**
//     * 属性描述：数据库访问提取数据时间间隔；单位：秒
//     *
//     * @date : 2021/1/26 0026 下午 2:56
//     */
//    private Long readTimeInterval;
//
//    /**
//     * 属性描述：通用配置数据属性暂存对象
//     *
//     * @date : 2021/1/26 0026 下午 2:31
//     */
//    private final Map<String, Object> dataCommonConfigCache;
//
//    /**
//     * 属性描述：微信配置单项数据属性暂存对象
//     *
//     * @date : 2021/1/26 0026 下午 2:40
//     */
//    private final Map<String, IWeiXinAttributeItem> dataItemConfigCache;
//
//    /**
//     * 属性描述：是否正在更新数据
//     *
//     * @date : 2021/1/26 0026 下午 3:27
//     */
//    private boolean isUpdating = false;
//
//    /**
//     * 构造方法中的参数标识每次执行几个线程
//     * <br />
//     * 1个任务占用1个线程
//     * <br />
//     * 特别注意：如果任意任务在执行过程中抛出异常后任务将不会再执行因为线程抛出异常后，底层会再创建一个线程
//     * 但是当前的任务已经丢失了；
//     */
//    private final ScheduledThreadPoolExecutor scheduledThreadPoolExecutor
//            = new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "微信JDBC获取数据线程"));
//
//    /**
//     * 功能描述：微信属性配置——持久化处理应用
//     *
//     * @param dataSource       数据源对象
//     * @param readTimeInterval 数据访问时间间隔；单位：秒
//     * @author : 王雷
//     * @date : 2021/1/26 0026 下午 2:21
//     */
//    public WeiXinJdbcCommonAttribute(DataSource dataSource, Long readTimeInterval) {
//        this.jdbcTemplate = new JdbcTemplate(dataSource);
//        this.dataCommonConfigCache = new HashMap<>(16);
//        this.dataItemConfigCache = new HashMap<>(16);
//        this.readTimeInterval = readTimeInterval;
//    }
//
//    @PostConstruct
//    public void init() {
//        //没有配置时间就使用默认的60秒更新一次数据
//        this.readTimeInterval = (readTimeInterval == null) ? 60L : readTimeInterval;
//        //开启线程；立即执行，执行完毕后间隔readTimeInterval秒后再次执行
//        scheduledThreadPoolExecutor.scheduleWithFixedDelay(new UpdateWeiXinAttribute(), 0
//                , readTimeInterval, TimeUnit.SECONDS);
//    }
//
//    /**
//     * 类描述: 线程数据库访问处理
//     *
//     * @author : 王雷
//     * @date : 2021/1/27 0027 下午 5:58
//     */
//    class UpdateWeiXinAttribute extends Thread {
//
//        /**
//         * If this thread was constructed using a separate
//         * <code>Runnable</code> run object, then that
//         * <code>Runnable</code> object's <code>run</code> method is called;
//         * otherwise, this method does nothing and returns.
//         * <p>
//         * Subclasses of <code>Thread</code> should override this method.
//         *
//         * @see #start()
//         * @see #stop()
//         * @see #Thread(ThreadGroup, Runnable, String)
//         */
//        @Override
//        public void run() {
//            initAttribute();
//        }
//    }
//
//    private final ReentrantLock reentrantLock = new ReentrantLock();
//    /**
//     * 属性描述：查询wx_basics_attribute_config表语句
//     * @date : 2022/6/25 0025 下午 8:37
//     */
//    private final String GIVE_WX_BASICS_ATTRIBUTE_CONFIG = "SELECT t.* FROM wx_basics_attribute_config t";
//    /**
//     * 属性描述：查询wx_item_attribute_config表语句
//     * @date : 2022/6/25 0025 下午 8:37
//     */
//    private final String GIVE_WX_ITEM_ATTRIBUTE_CONFIG = "SELECT t.* FROM wx_item_attribute_config t";
//
//    /**
//     * 功能描述：初始化属性数据
//     *
//     * @author : 王雷
//     * @date : 2021/1/27 0027 下午 5:25
//     */
//    @Override
//    public void initAttribute() {
//        reentrantLock.lock();
//        try {
//            isUpdating = true;
//            //查询基础属性配置数据
//            final Map<String, Object> commonAttributeMap = jdbcTemplate.queryForMap(GIVE_WX_BASICS_ATTRIBUTE_CONFIG);
//            //获取所有单项属性配置
//            final List<Map<String, Object>> itemAttributeMapList = jdbcTemplate.queryForList(GIVE_WX_ITEM_ATTRIBUTE_CONFIG);
//
//            //处理单行属性
//            if (itemAttributeMapList.size() <= 0) {
//                log.error("没有可用的单项信息，停止替换处理");
//                return;
//            }
//
//            final Map<String, IWeiXinAttributeItem> iWeiXinAttributeItemMap = new HashMap<>(16);
//
//            itemAttributeMapList.forEach(dataMap -> {
//                try {
//                    if (StringUtil.IsNullOrBlank(dataMap.get("wiac_item_key"))) {
//                        log.error("数据：{}；没有可用的key", dataMap);
//                        return;
//                    }
//                    final WeiXinAttributeItem weiXinAttributeItem = new WeiXinAttributeItem();
//                    weiXinAttributeItem.setAppId(dataMap.get("wiac_app_id").toString());
//                    weiXinAttributeItem.setAppSecret(dataMap.get("wiac_app_secret").toString());
//                    if (dataMap.get("wiac_order_body_value") == null) {
//                        weiXinAttributeItem.setOrderBodyValue(dataMap.get("wiac_order_body_value").toString());
//                    } else {
//                        weiXinAttributeItem.setOrderBodyValue("商品");
//                    }
//                    int payWaitingCycle = 60;
//                    if (dataMap.get("wiac_pay_waiting_cycle") != null) {
//                        payWaitingCycle = Integer.parseInt(dataMap.get("wiac_pay_waiting_cycle").toString());
//                    }
//                    weiXinAttributeItem.setPayWaitingCycle(payWaitingCycle);
//                    /*weiXinAttributeItem.setPayMchSecret(dataMap.get("wiac_pay_mch_secret").toString());
//                    weiXinAttributeItem.setMchId(dataMap.get("wiac_mch_id").toString());*/
//                    if (dataMap.get("wiac_refund_remark_value") != null) {
//                        weiXinAttributeItem.setRefundRemarkValue(dataMap.get("wiac_refund_remark_value").toString());
//                    }
//                    /*if (dataMap.get("wiac_certificate_value") != null) {
//                        weiXinAttributeItem.setCertificateValue(dataMap.get("wiac_certificate_value").toString());
//                    }
//                    if (dataMap.get("wiac_certificate_key_psd") != null) {
//                        weiXinAttributeItem.setCertificateKeyPsd(dataMap.get("wiac_certificate_key_psd").toString());
//                    }*/
//                    iWeiXinAttributeItemMap.put(dataMap.get("wiac_item_key").toString(), weiXinAttributeItem);
//                } catch (Exception e) {
//                    log.error("处理单行数据：{}；发生异常", dataMap, e);
//                }
//            });
//
//            if (iWeiXinAttributeItemMap.size() <= 0) {
//                log.error("没有可用的单项信息，停止替换处理");
//                return;
//            }
//
//            //通用属性赋值
//            dataCommonConfigCache.clear();
//            dataCommonConfigCache.putAll(commonAttributeMap);
//
//            dataItemConfigCache.clear();
//            dataItemConfigCache.putAll(iWeiXinAttributeItemMap);
//
//        } catch (Exception e) {
//            log.error("查询数据处理失败", e);
//        } finally {
//            reentrantLock.unlock();
//            isUpdating = false;
//        }
//    }
//
//    /**
//     * 功能描述：微信访问地址——换取Token地址
//     *
//     * @author : 王雷
//     * @date : 2021/1/16 0016 下午 9:07
//     */
//    @Override
//    public String giveCodeUrl() {
//        return giveDataToStr("wbac_token_url");
//    }
//
//    /**
//     * 功能描述：微信访问地址——获取用户信息地址
//     *
//     * @author : 王雷
//     * @date : 2021/1/16 0016 下午 10:49
//     */
//    @Override
//    public String giveUserInfoUrl() {
//        return giveDataToStr("wbac_user_info_url");
//    }
//
//    /**
//     * 功能描述：微信访问地址——换取Access_Token地址
//     *
//     * @author : 王雷
//     * @date : 2021/1/16 0016 下午 10:48
//     */
//    @Override
//    public String giveAccessTokenUrl() {
//        return giveDataToStr("wbac_updata_token_url");
//    }
//
//    /**
//     * 功能描述：微信访问地址——换取JsapiTicket地址
//     *
//     * @author : 王雷
//     * @date : 2021/1/16 0016 下午 10:48
//     */
//    @Override
//    public String giveJsapiTicketUrl() {
//        return giveDataToStr("wbac_jsapi_ticket_url");
//    }
//
//    /**
//     * 功能描述：微信访问地址——下单地址
//     *
//     * @author : 王雷
//     * @date : 2021/1/16 0016 下午 10:48
//     */
//    @Override
//    public String giveUnifiedOrderUrl() {
//        return giveDataToStr("wbac_unified_order_url");
//    }
//
//    /**
//     * 功能描述：微信访问地址——查询订单地址
//     *
//     * @author : 王雷
//     * @date : 2021/1/16 0016 下午 10:48
//     */
//    @Override
//    public String giveSearchOrderUrl() {
//        return giveDataToStr("wbac_search_order_url");
//    }
//
//    /**
//     * 功能描述：微信访问地址——关闭订单地址
//     *
//     * @author : 王雷
//     * @date : 2021/1/16 0016 下午 10:48
//     */
//    @Override
//    public String giveCloseOrderUrl() {
//        return giveDataToStr("wbac_close_order_url");
//    }
//
//    /**
//     * 功能描述：微信访问地址——订单退款地址
//     *
//     * @author : 王雷
//     * @date : 2021/1/16 0016 下午 10:48
//     */
//    @Override
//    public String giveRefundOrderUrl() {
//        return giveDataToStr("wbac_refund_order_url");
//    }
//
//    /**
//     * 功能描述：微信访问地址——下单回调接口
//     *
//     * @author : 王雷
//     * @date : 2021/1/16 0016 下午 10:48
//     */
//    @Override
//    public String givePayCallBackUrl() {
//        return giveDataToStr("wbac_pay_call_back_url");
//    }
//
//    /**
//     * 功能描述：定时器执行间隔
//     *
//     * @author : 王雷
//     * @date : 2021/1/19 0019 下午 8:23
//     */
//    @Override
//    public Long giveExecutionInterval() {
//        try {
//            final String interval = giveDataToStr("wbac_execution_interval");
//            long wbacExecutionInterval = (interval == null) ? 5000L : Long.parseLong(interval);
//            return (wbacExecutionInterval<=0)?5000L:wbacExecutionInterval;
//        } catch (Exception e) {
//            log.error("基础配置属性对象：WeiXinJdbcCommonAttribute读取定时器执行时间间隔数据：{}；处理异常", giveDataToStr("wbac_execution_interval"), e);
//            return 5000L;
//        }
//    }
//
//    /**
//     * 功能描述：根据Key获取配置单项
//     *
//     * @param key 配置单项识别Key
//     * @return 单项配置信息
//     * @author : 王雷
//     * @date : 2021/1/21 0021 上午 10:17
//     */
//    @Override
//    public IWeiXinAttributeItem giveAttributeItem(String key) {
//        //自旋用于更新时等待更新最后的结果
//        while (isUpdating) {
//            try {
//                Thread.sleep(500);
//            } catch (InterruptedException e) {
//                log.error("线程等待");
//            }
//        }
//        return dataItemConfigCache.get(key);
//    }
//
//    /**
//     * 功能描述：微信配置单项Key
//     *
//     * @return key集合
//     * @author : 王雷
//     * @date : 2021/1/21 0021 上午 10:17
//     */
//    @Override
//    public Collection<String> giveAttributeItemKeys() {
//        //自旋用于更新时等待更新最后的结果
//        while (isUpdating) {
//            try {
//                Thread.sleep(500);
//            } catch (InterruptedException e) {
//                log.error("线程等待");
//            }
//        }
//        return dataItemConfigCache.keySet();
//    }
//
//    /**
//     * 功能描述：获取缓存的数据并输出为String
//     *
//     * @param key 获取缓存的键
//     * @return 结果
//     * @author : 王雷
//     * @date : 2021/1/26 0026 下午 3:02
//     */
//    private String giveDataToStr(String key) {
//        //自旋用于更新时等待更新最后的结果
//        while (isUpdating) {
//            try {
//                Thread.sleep(500);
//            } catch (InterruptedException e) {
//                log.error("线程等待");
//            }
//        }
//        if (dataCommonConfigCache.get(key) != null) {
//            return dataCommonConfigCache.get(key).toString();
//        } else {
//            return null;
//        }
//    }
//}
